#ifndef ROBOT_SYSTEM_H
#define ROBOT_SYSTEM_H

#include <QObject>
#include <memory>          // 用于 std::unique_ptr（智能指针）
#include <QtNetwork/QTcpServer>  // 提前包含网络类，避免 secure_comm.h 依赖问题
#include "robot_state.h"   // 修复：添加 RobotState 结构体头文件（原错误：少 #include）
#include "control_command.h"// 修复：添加 ControlCommand 结构体头文件

// 前向声明：未实现的类先声明（避免“未定义”错误，后续实现后可补充头文件）
class UserManager;       // 用户管理类（暂时未实现）
class DebugVisualizer;   // 调试可视化类（暂时未实现）

/**
 * @brief 机器人系统核心类
 * 管理机器人状态、控制指令、网络通信等核心逻辑
 */
class RobotSystem : public QObject
{
    Q_OBJECT  // Qt 信号槽必须的宏（不可删除，否则信号槽失效）

public:
    /**
     * @brief 构造函数
     * @param parent 父对象（Qt 内存管理机制）
     */
    explicit RobotSystem(QObject *parent = nullptr);

    /**
     * @brief 析构函数（虚函数，确保子类正确析构）
     */
    ~RobotSystem() override;

    /**
     * @brief 初始化系统（初始化通信、状态等）
     * @return bool - true=初始化成功，false=失败
     */
    bool init();

    /**
     * @brief 获取当前机器人状态
     * @return RobotState - 当前状态的拷贝
     */
    RobotState getCurrentState() const;

signals:
    /**
     * @brief 状态更新信号（对外通知状态变化）
     * @param state 新的机器人状态
     */
    void stateUpdated(const RobotState& state);

    /**
     * @brief 指令发送完成信号（通知外部指令已发送）
     * @param cmd 已发送的控制指令
     */
    void commandSent(const ControlCommand& cmd);

public slots:
    /**
     * @brief 发送控制指令（外部调用此槽函数发送指令）
     * @param cmd 待发送的控制指令
     */
    void sendCommand(const ControlCommand& cmd);

    /**
     * @brief 处理新的TCP客户端连接（网络通信逻辑）
     */
    void handleNewClientConnection();

private:
    /**
     * @brief 内部状态更新函数（更新当前状态并发送信号）
     * @param new_state 新的状态
     */
    void updateState(const RobotState& new_state);

    // 成员变量
    RobotState current_state_;                  // 当前机器人状态
    std::unique_ptr<QTcpServer> tcp_server_;    // TCP服务端（管理客户端连接）
    // std::unique_ptr<UserManager> user_manager_;  // 修复：暂时注释（未实现），后续实现后恢复
    std::unique_ptr<DebugVisualizer> visualizer_;// 调试可视化对象（前向声明）
    bool is_initialized_ = false;               // 系统初始化标记（true=已初始化）
};

#endif // ROBOT_SYSTEM_H